#!/bin/sh
#
# get-authors
# Copyright (c) 2009-2024  The cvc5 Project
#
# usage: get-authors [ files... ]
#
# This script uses git blame -w -N -C to get the original author
#

gituser="`git config user.name` <`git config user.email`>"

while [ $# -gt 0 ]; do
  f=$1
  shift
  if ! grep -q " Top contributors" "$f"
  then
    header_lines=0
  else
    header_lines=$(grep "^ \*\/" "$f" -m 1 -n | cut -d ':' -f 1)
    if [ -z $header_lines ]; then
      header_lines=$(grep "^##$" "$f" -m 3 -n | tail -n 1 | cut -d ':' -f 1)
      [ -z "$header_lines" ] && header_lines=0;
    fi
  fi
  ((header_lines++))
  total_lines=$(wc -l "$f" | awk '{print$1}')

  # Note: Instead of using the porcelain format, we extract the author name
  # information from the humand readable format since it prints the source code
  # and we want to exclude specific lines of code.

  # Each line looks a follows:
  #
  # sha1 filename (Author Name       2019-03-25 13:36:07 -0800   42) code ...

  git blame -w -M -C -L $header_lines,$total_lines "$f" | \

    # Discard everthing left to first '('
    awk -F '(' '{print $2}' | \

    # Discard the source code left to first ')' and omit lines that begin
    # with:
    # (1) #include
    # (2) namespace
    # (3) } ... namespace ...
    # (4) empty lines
    #
    awk -F ')' \
      '$2 !~ /^[ \t]*(#include|namespace|}.*namespace.*|[ \t]*$)/ {print $1}' | \

    # Keep author names only, remove the last 4 columns in ( ... )

    awk 'NF{NF-=4};1' | \

    # Fix author names
    sed "s,Not Committed Yet <not.committed.yet>,$gituser," | \
    sed 's/PaulMeng/Paul Meng/' | \
    sed 's/barrettcw/Clark Barrett/' | \
    sed 's/Andres Nötzli/Andres Noetzli/' | \
    sed 's/Andres Notzli/Andres Noetzli/' | \
    sed 's/guykatzz/Guy/' | \
    sed 's/Guy Katz/Guy/' | \
    sed 's/Guy/Guy Katz/' | \
    sed 's/makaimann/Makai Mann/' | \
    sed 's/Martin Brain/Martin/' | \
    sed 's/Martin/Martin Brain/' | \
    sed 's/nafur/Gereon Kremer/' | \
    sed 's/justinxu421/Justin Xu/' | \
    sed 's/yoni206/Yoni Zohar/' | \
    sed 's/ayveejay/Andrew V. Jones/' | \
    sed 's/FabianWolff/Fabian Wolff/' | \
    sed 's/mudathirmahgoub/Mudathir Mohamed/' | \
    sed 's/mcjuneho/Michael Chang/' | \
    sed 's/MikolasJanota/Mikolas Janota/' | \
    sed 's/Ouyancheng/Yancheng Ou/' | \
    sed 's/Lachnitt/Hanna Lachnitt/' | \
    sed 's/vinciusb/Vinícius Braga Freire/' | \
    sed 's/sorawee/Sorawee Porncharoenwase/' | \
    sed 's/Sarkoxed/Alex Sokolov/' | \
    sed 's/Hans-Jörg/Hans-Joerg Schurr/' | \

    # Determine top three contributors
    sort | uniq -c | sort -rn | head -n3 | \

    # Remove first columns from uniq -c (number of lines)
    awk '{$1=""; print}' | \

    # Comma separated list of author names, remove leading whitespaces, and
    # remove trailing comma
    tr '\n' ', ' | sed 's/^[ \t]*//' | sed 's/,$/\n/'
done
